﻿using ConfExpert.Utility;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.Repository;
using DevTeam;
using System;
using System.Data;
using System.Windows.Forms;

namespace ConfExpert.Forms.Depo.Kargo
{
    public partial class KargoEkle : XPopupForm
    {
        int kargoTipi;
        public KargoEkle(int kargoTipi)
        {
            InitializeComponent();
            this.kargoTipi = kargoTipi;
        }


        int userId;
        private void KargoEkle_Load(object sender, EventArgs e)
        {

            cmbIsKargoBilled.Visible = false;
            //            this.HeaderPanel.Height = 35;
            txtWhereTo.Visible = false;

            userId = WhoAmI;
            DataTable dtCari = new DataTable();
            RepositoryItemGridLookUpEdit riCari = new RepositoryItemGridLookUpEdit();
            riCari.TextEditStyle = TextEditStyles.DisableTextEditor;

            if (ytk(151)) // Kumaş departmanına sadece üreticiler gözüküyor
                dtCari = AppSession.Lookups.Vendor;
            else // Geri kalanlar da sadece kendi müşterilerini görebiliyor
                dtCari = Session.DataManager.ExecuteDataTable("GetMyCustomers2", userId);

            riCari = GetCustomGLE(dtCari, "Name", "CariId");
            gleCari.Properties.Assign(riCari);

            DataTable dtKargo = AppSession.Lookups.KargoFirma; // TODO: DHL ve Yurtiçi dışındakiler her zaman karşı ödemelidir.
            RepositoryItemGridLookUpEdit riKargoFirm = GetCustomGLE(Session.DataManager.ExecuteDataTableByQuery("select * from KargoFirma"), "Name", "KargoFirmaId");
            riKargoFirm.TextEditStyle = TextEditStyles.DisableTextEditor;
            gleKargoFirm.Properties.Assign(riKargoFirm);
            gleKargoFirm.EditValue = 1;
            gleKargoFirm.EditValueChanged += gleKargoFirm_EditValueChanged;

            gleCurrency.Properties.Assign(RI(Rp.Currency)); gleCurrency.EditValue = 1;
            gleCurrencyK.Properties.Assign(RI(Rp.Currency)); gleCurrencyK.EditValue = 1;

            RepositoryItemComboBox riContent = new RepositoryItemComboBox();
            riContent.Items.AddRange(new object[] { "Gömlek", "Döküman", "Kumaş", "Kartela", "Hediye", "Aksesuar", "Tela" });
            cmbContent.Properties.Assign(riContent);
            cmbContent.EditValueChanged += cmbContent_EditValueChanged;

            RepositoryItemComboBox riFrom = new RepositoryItemComboBox();
            riFrom.TextEditStyle = TextEditStyles.DisableTextEditor;
            riFrom.Items.AddRange(new object[] { "Konfeksiyon", "Dış Ticaret" });
            cmbFrom.Properties.Assign(riFrom);
            cmbFrom.EditValue = riFrom.Items[0];

            RepositoryItemComboBox riWhoPays = new RepositoryItemComboBox();
            riWhoPays.TextEditStyle = TextEditStyles.DisableTextEditor;
            riWhoPays.Items.AddRange(new object[] { "KARBEL", "ALICI" });
            cmbWhoPays.Properties.Assign(riWhoPays);
            cmbWhoPays.EditValue = riWhoPays.Items[1]; // Cemal Bey: default kargo masrafı alıcı olsun.
            //cmbWhoPays.SelectedIndexChanged += cmbWhoPays_SelectedIndexChanged;

            RepositoryItemComboBox riIsKargoBilled = new RepositoryItemComboBox();
            riIsKargoBilled.TextEditStyle = TextEditStyles.DisableTextEditor;
            riIsKargoBilled.Items.AddRange(new object[] { "EVET", "HAYIR" });
            cmbIsKargoBilled.Properties.Assign(riIsKargoBilled);

            RepositoryItemComboBox riIsProductBilled = new RepositoryItemComboBox();
            riIsProductBilled.TextEditStyle = TextEditStyles.DisableTextEditor;
            riIsProductBilled.Items.AddRange(new object[] { "EVET", "HAYIR" });
            cmbIsProductBilled.Properties.Assign(riIsProductBilled);

            txtKargoTipi.ReadOnly = txtPrefix.ReadOnly = true;
            //lblIsKargoBilled.Text = "Kargo masrafı fatura edilecek";
            //lblIsProductBilled.Text = "Ürün fatura edilecek";
            //lblKargoTutar.Text = "Kargo Masrafını faturaya ekle";
            //lblKargoUrunFaturaNotu.Text = "Kargo malzeme\r\nfatura notu";

            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            if (this.kargoTipi == 2) // Proformalı ise
            {
                this.Width = 330;
                cmbIsProductBilled.Visible = lblIsProductBilled.Visible = true;
            }
            else // Mikro İhracat ise ürün kesinlikle fatura edilmeli
            {
                ceKargoTutar.CheckedChanged += ceKargoTutar_CheckedChanged;
                numKargoFaturaTutar.Visible = gleCurrencyK.Visible = false;
                cmbIsProductBilled.Visible = lblIsProductBilled.Visible = false;
                cmbIsProductBilled.SelectedIndex = 0;
                cmbIsKargoBilled.SelectedIndexChanged += cmbIsKargoBilled_SelectedIndexChanged;

                /* Mikro ihracatta eğer karbel ödemeli ise ve kargo masrafı fatura edilecekse;
                 * kargo faturasının tutarı o an için girilsin, opsiyonel olmasın denmişti.
                 * Ancak ben tahmin ediyorum ki tekrar opsiyonel olabilmesi istenecek (yani faturayı sonradan girmek istiyorum diyecekler).
                 * Eğer öyle isterlerse aşağıdaki if bloğunu comment out yapabilirsiniz. */
                //if (WhoAmI != 120)
                //{
                //    ceKargoTutar.Visible = false;
                //    lblKargoTutar.Text = "Kargo Fatura Tutarı";
                //}
            }


            btnKoliEkle.ItemClick += btnKoliEkle_ItemClick;
      

           
        }

        void btnKoliEkle_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            using (KargoKoli kargoKoli = new KargoKoli())//(kargoId, 1))
                kargoKoli.ShowDialog();
        }

        void cmbIsKargoBilled_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbIsKargoBilled.SelectedIndex == -1)
                return;
            if (this.kargoTipi == 1)
                if (cmbIsKargoBilled.SelectedIndex == 0)
                    ceKargoTutar.Checked = true;
                else
                    ceKargoTutar.Checked = false;
        }

        void ceKargoTutar_CheckedChanged(object sender, EventArgs e)
        {
            if (ceKargoTutar.Checked)
                numKargoFaturaTutar.Visible = gleCurrencyK.Visible = true;
            else
                numKargoFaturaTutar.Visible = gleCurrencyK.Visible = false;
        }

        void gleKargoFirm_EditValueChanged(object sender, EventArgs e)
        {
            // İlk başta Özkan'la tasarlarken DHL ve Yurtiçi gönderileri default KARBEL ödemeli, diğerleri ALICI ödemeli olsun denmişti
            // çünkü gerçekten de genel olarak durum bu.
            // Sonrasında Cemal Bey default hep alıcı olsun; isterlerse KARBEL seçsinler dedi. o yüzden aşağıdaki if-else comment out oldu.
            // Tekrar aynı yapıya dönmek isterlerse devreye alınabilir.
            //if (gleKargoFirm.Text == "DHL" || gleKargoFirm.Text == "Yurtiçi")
            //    cmbWhoPays.SelectedIndex = 0;
            //else
            //    cmbWhoPays.SelectedIndex = 1;
            cmbWhoPays.SelectedIndex = 1; // Yukarıdaki senaryoyu tekrar işletmek isterlerse bu satır comment out yapılmalı.
        }

        void cmbContent_EditValueChanged(object sender, EventArgs e)
        {
            if (cmbContent.EditValue.ToStr() == "Kumaş" || cmbContent.EditValue.ToStr() == "Tela")
                lblBirim.Text = "Metre";
            else if (cmbContent.EditValue.ToStr() == "Döküman")
                lblBirim.Text = "";
            else
                lblBirim.Text = "Adet";
        }

        private void cmbWhoPays_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbWhoPays.SelectedIndex == 1)
            {
                cmbIsKargoBilled.SelectedIndex = -1;
                cmbIsKargoBilled.Text = "SEÇİNİZ";
                cmbIsKargoBilled.Visible = lblIsKargoBilled.Visible = false;
            }
            else
                cmbIsKargoBilled.Visible = lblIsKargoBilled.Visible = true;
        }

        private void bbiEkle_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(txtWayBill.Text))
            {
                XtraMessageBox.Show("Waybill numarası boş geçilemez", "Hata");
                return;
            }

            if (gleCari.SelectionLength < 2 && txtWhereTo.Text.Length < 1)
            {
                XtraMessageBox.Show("Müşteri seçmelisiniz.", "Hata");
                return;
            }

            if (cmbIsKargoBilled.SelectedIndex < 0 && cmbWhoPays.Text == "KARBEL")
            {
                XtraMessageBox.Show("Lütfen kargonun faturalanıp faturalanmayacağı bilgisini belirtiniz.", "Hata");
                return;
            }

            string urunFaturaNo = "";
            DateTime urunFaturaTarihi = new DateTime();
            double urunFaturaTutari = 0.0;
            double kargoFaturaTutari = 0.0;
            int urunCurrency, kargoCurrency;
            if (this.kargoTipi == 1)
            {
                txtFaturaNo.TextChanged += txtFaturaNo_TextChanged;
                if (txtFaturaNo.Text.Length != 4) // Mikro ihracat faturasının formatı "MEX-XXXX" şeklindedir. X-->rakam
                {
                    XtraMessageBox.Show("Fatura numarası 4 karakterli bir sayı olmalıdır.", "Hata");
                    return;
                }

                if (numFaturaTutar.Value <= 0)
                {
                    XtraMessageBox.Show("Lütfen malzemelerin tutarını sıfırdan büyük giriniz.", "Hata");
                    return;
                }

                urunFaturaNo = txtFaturaNo.Text;
                urunFaturaTarihi = deFaturaTarihi.EditValue.ToDate(); //Exception handle edilmeli.
                urunFaturaTutari = Convert.ToDouble(numFaturaTutar.Value);
                urunCurrency = gleCurrency.EditValue.ToInt(-1);
                if (ceKargoTutar.Checked)
                {
                    if (numKargoFaturaTutar.Value <= 0)
                    {
                        XtraMessageBox.Show("Lütfen kargo fatura tutarını sıfırdan büyük giriniz.", "Hata");
                        return;
                    }
                    kargoFaturaTutari = Convert.ToDouble(numKargoFaturaTutar.Value);
                    kargoCurrency = gleCurrencyK.EditValue.ToInt(-1);
                }
            }

            int kargoFirm = gleKargoFirm.EditValue.ToInt(-1);
            string wayBill = txtWayBill.Text.Replace(" ", "");
            int cariId = gleCari.EditValue.ToInt(-1);
            string whereTo = txtWhereTo.Text;  // Kayıtlı bir cariId'ye gönderilmeyecekse bu kullanılıyor.
            bool isKargoBilled = cmbIsKargoBilled.SelectedIndex == 0 ? true : false;
            string whoPays = "";
            if (cmbWhoPays.SelectedIndex > -1)
                whoPays = cmbWhoPays.EditValue.ToStr();
            bool isProductBilled = cmbIsProductBilled.SelectedIndex == 0 ? true : false;
            string from = cmbFrom.EditValue.ToStr();
            int pieces = numPieces.Value.ToInt(-1);
            string content = cmbContent.EditValue.ToStr();

            ExecuteNonQuery("InsKargo", kargoFirm, kargoTipi, wayBill, userId, cariId, whereTo, DateTime.Now, isKargoBilled, whoPays, isProductBilled, from, pieces, content, txtKargoNot.Text);
            if (this.kargoTipi == 1)
            {
                urunFaturaNo = "MEX-" + urunFaturaNo.ToStr();
                ExecuteNonQuery("InsKargoFatura", -1, 2, urunFaturaNo, urunFaturaTarihi, urunFaturaTutari, gleCurrency.EditValue, txtUrunFaturaNotu.Text);
                if (ceKargoTutar.Checked)
                    ExecuteNonQuery("InsKargoFatura", -1, 1, urunFaturaNo, urunFaturaTarihi, kargoFaturaTutari, gleCurrencyK.EditValue, txtUrunFaturaNotu.Text);
            }
            XtraMessageBox.Show("Kayıt başarılı.");
            this.Close();
        }

        private void txtFaturaNo_TextChanged(object sender, EventArgs e)
        {
            string tmp = txtFaturaNo.Text;
            foreach (char c in tmp.ToCharArray())
                if (!(c >= '0' && c <= '9'))
                    tmp = tmp.Replace(c.ToString(), "");
            txtFaturaNo.Text = tmp;
        }

        private void txtFaturaNo_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
        }

        private void numFaturaTutar_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '.')
                e.KeyChar = ',';
        }

        private void numKargoFaturaTutar_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '.')
                e.KeyChar = ',';
        }

        private void chkNew_CheckedChanged(object sender, EventArgs e)
        {
            if (chkNew.Checked)
            {
                txtWhereTo.Visible = true;
                gleCari.Visible = false;
                gleCari.EditValue = -1;
            }
            else
            {
                txtWhereTo.Visible = false;
                gleCari.Visible = true;
                txtWhereTo.Text = "";
            }
        }

        //public bool IsDigit(char c)
        //{
        //    return (c >= '0' && c <= '9');
        //}
    }
}